﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QStringList>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QPixmap>
#include <QDateTime>
#include <QPushButton>
#include <QDir>
#include <QMetaType>

#include "dashboard.h"
#include "rockerbutton.h"
#include "detectimage.h"
#include "videoplayer.h"
#include "paintlabel.h"

#include "rtypes.h"


#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif

Q_DECLARE_METATYPE(ROI_FRAME);
Q_DECLARE_METATYPE(Mat);


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:

    void slotsInit(void);
    void styleSheetInit(void);
    /*********************** 错误处理 ***********************/
    void errorCodeInit(void);     /* 初始化 */
    void appendErrorInfo(int);    /* 追加一条错误信息 */
    void removeErrorinfo(int);    /* 移除一条错误信息 */

    /*********************** 视频播放 ***********************/
    void playerInit(void);      /* 播放器初始化 */
    void playerDeinit(void);    /* 反初始化 */
    void startPlayer(void);     /* 开始播放 */
    void stopPlayer(void);      /* 停止播放 */
    /*********************** 数传 ***********************/
    void serialPortInit(void);

    /*********************** 其他 ***********************/
    QImage cvMat2QImage(const cv::Mat &mat);

    bool createFolder(QString);       /* 如果文件夹不存在就创建 */
    void showAndSaveImage(QImage);    /* 显示并保存一幅图像 */
protected:
    bool eventFilter(QObject *obj, QEvent *e);


public slots:

    void slotRecvErrorCode(int);   /* 接收videoplayer线程的log */

private slots:

    void slotVideoTimerOut(void);    /* 显示视频定时器 超时中断函数 */
    void slotRecordTimerOut(void);   /* 录制视频定时器超时中断函数 */
    void slotSerialReadyRead(void);  /* 数传串口准备读槽函数 */


    void slotBtnForward(void);       /* 控制机器人前进槽函数 */
    void slotBtnBackward(void);      /* 控制机器人后退槽函数 */
    void slotBtnTurnLeft(void);      /* 控制机器人左转槽函数 */
    void slotBtnTurnRight(void);     /* 控制机器人右转槽函数 */
    void slotBtnShiftLeft(void);     /* 控制机器人左移槽函数 */
    void slotBtnShiftRight(void);    /* 控制机器人右移槽函数 */

    void slotBtnOrigin(void);        /* 机械臂归中槽函数 */
    void slotBtnShiftForward(void);  /* 机械臂前移槽函数 */
    void slotBtnPress(void);         /* 机械臂点按槽函数 */

    void slotBtnOpenVideo(void);     /* 打开视频按钮槽函数   */
    void slotBtnOpenSerial(void);    /* 打开串口槽函数 */
    void slotBtnScreenShot(void);    /* 拍照槽函数 */
    void slotBtnRecord(void);        /* 录像槽函数 */

private:
    Ui::MainWindow *ui;

    QMap<int, QString> errorCodeDict; /* 存储错误信息字典变量，int错误码，string错误信息 */




    VideoPlayer *pPlayer;          /* 播放器线程类   */
    QTimer *pRecordTimer;          /* 录像定时器 */
    QTimer *pVideoTimer;
    bool mScreenShotFlag = false;  /* 拍照标志位 */
    bool mRecordVideoFlag = false; /* 录像标志位 */
    unsigned int mRecordTime;      /* 录像时间 */
    DetectImage *pDetecter;        /* 图像检测线程类 */

    QSerialPort *pSerial;          /* 数传串口 */

    QLabel *pLabelImage;           /* 拍照显示控件 */

    QString screenShotDefaultPath; /* 默认拍照保存路径 */
    QString recordDefaultPath;     /* 默认录像保存路径 */

    Mat frame;

};

#endif // MAINWINDOW_H
